package com.fjnu.dao;

import com.fjnu.dto.ArticleConditionDto;
import com.fjnu.entity.Article;

import java.util.Date;
import java.util.List;

/**
 * 文章模块DAO接口
 * 对应实验任务3中的文章模块方法定义
 */
public interface ArticleDao {
    
    /**
     * （1）新增文章
     * @param article 文章对象
     * @return 插入成功返回1，失败返回0
     */
    int insert(Article article);
    
    /**
     * （2）更新文章内容
     * @param id 文章ID
     * @param newContent 新的内容
     * @return 更新成功返回1，失败返回0
     */
    int updateContent(Integer id, String newContent);
    
    /**
     * （3）更新文章标题
     * @param id 文章ID
     * @param newTitle 新的标题
     * @return 更新成功返回1，失败返回0
     */
    int updateTitle(Integer id, String newTitle);

    /**
     * （4）按照文章的条件进行修改
     * @param id 文章ID
     * @param articleCondition 文章更新条件
     * @return 更新成功返回1，失败返回0
     */
    int updateByCondition(Integer id, ArticleConditionDto articleCondition);

    /**
     * （5）修改文章的状态
     * @param id 文章ID
     * @param newStatus 新状态（0或1）
     * @return 修改成功返回1，失败返回0
     */
    int updateStatus(Integer id, Integer newStatus);

    /**
     * （6）批量修改文章的状态
     * @param ids 文章ID列表
     * @param newStatus 新状态（0或1）
     * @return 修改成功的记录数
     */
    int batchUpdateStatus(List<Integer> ids, Integer newStatus);

    /**
     * （7）删除文章
     * @param id 文章ID
     * @return 删除成功返回1，失败返回0
     */
    int deleteById(Integer id);
    
    /**
     * （5）按照用户id查询文章
     * @param userId 用户ID
     * @return 按照创建时间的降序文章列表，若无结果则返回null
     */
    List<Article> selectByUserId(Integer userId);
    
    /**
     * （6）按照文章title或内容的关键词模糊查询
     * @param keyword 关键词
     * @return 按照创建时间的降序文章列表，若无结果则返回null
     */
    List<Article> selectByKeyWord(String keyword);
    
    /**
     * （7）按照文章的创建时间的时间区间进行查询
     * @param startTime 开始时间（可以为空）
     * @param endTime 结束时间（可以为空）
     * @return 按照创建时间的降序文章列表，若无结果则返回null
     */
    List<Article> selectByTimePeriod(Date startTime, Date endTime);
    
    /**
     * （8）按照文章的标签对文章进行查询
     * @param tagId 标签ID
     * @return 按照创建时间的降序文章列表，若无结果则返回null
     */
    List<Article> selectByTag(Integer tagId);
    
    /**
     * （9）按照文章的类别进行查询
     * @param categoryId 类别ID
     * @return 按照创建时间的降序文章列表，若无结果则返回null
     */
    List<Article> selectByCategory(Integer categoryId);
}